/**
 * 日期格式化函数
 * @param date 日期字符串或Date对象
 * @param fmt 格式化模式 例如：'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的日期字符串
 *
 * 使用示例：
 * formatDate('2024-03-20', 'YYYY-MM-DD') => '2024-03-20'
 * formatDate('2024-03-20 15:30:00', 'MM月DD日 HH:mm') => '03月20日 15:30'
 */
export const formatDate = (date: string | Date, fmt: string = 'YYYY-MM-DD'): string => {
  const d = new Date(date);

  if (isNaN(d.getTime())) {
    return '';
  }

  const opt = {
    'Y+': d.getFullYear().toString(),
    'M+': (d.getMonth() + 1).toString().padStart(2, '0'),
    'D+': d.getDate().toString().padStart(2, '0'),
    'H+': d.getHours().toString().padStart(2, '0'),
    'm+': d.getMinutes().toString().padStart(2, '0'),
    's+': d.getSeconds().toString().padStart(2, '0')
  };

  for (const k in opt) {
    const ret = new RegExp(`(${k})`).exec(fmt);
    if (ret) {
      fmt = fmt.replace(ret[1], opt[k]);
    }
  }

  return fmt;
};

/**
 * 获取相对时间描述
 * @param date 日期字符串或Date对象
 * @returns 相对时间描述
 *
 * 使用示例：
 * getRelativeTime('2024-03-20') => '3天前'
 */
export const getRelativeTime = (date: string | Date): string => {
  const d = new Date(date);
  const now = new Date();
  const diff = now.getTime() - d.getTime();

  if (isNaN(d.getTime())) {
    return '';
  }

  const minute = 1000 * 60;
  const hour = minute * 60;
  const day = hour * 24;
  const month = day * 30;
  const year = month * 12;

  if (diff < minute) {
    return '刚刚';
  } else if (diff < hour) {
    return `${Math.floor(diff / minute)}分钟前`;
  } else if (diff < day) {
    return `${Math.floor(diff / hour)}小时前`;
  } else if (diff < month) {
    return `${Math.floor(diff / day)}天前`;
  } else if (diff < year) {
    return `${Math.floor(diff / month)}个月前`;
  } else {
    return `${Math.floor(diff / year)}年前`;
  }
};

/**
 * 判断是否为同一天
 * @param date1 日期1
 * @param date2 日期2
 * @returns boolean
 */
export const isSameDay = (date1: string | Date, date2: string | Date): boolean => {
  const d1 = new Date(date1);
  const d2 = new Date(date2);
  return (
    d1.getFullYear() === d2.getFullYear() &&
    d1.getMonth() === d2.getMonth() &&
    d1.getDate() === d2.getDate()
  );
};
